﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.IO;
using System.Globalization; 

namespace FGK
{
    class Program
    {
        static void Main(string[] args)
        {
            //WCZYTYWANIE OBJ
            string filePath = "file5.obj";
            string line;
            Stack<Trojkat> trojkaty = new Stack<Trojkat>();
            Stack<Wektor> wierzcholki = new Stack<Wektor>();
            Stack<Wektor> normalne = new Stack<Wektor>();
            //początek wczytywania
            if (File.Exists(filePath))
            {
                StreamReader file = null;
                try
                {
                    file = new StreamReader(filePath);
                    while ((line = file.ReadLine()) != null)
                    {
                        String[] words = line.Split(' ');
                        if (words[0] == "v")
                        {
                            wierzcholki.Push(new Wektor(float.Parse(words[2], CultureInfo.InvariantCulture), float.Parse(words[3], CultureInfo.InvariantCulture), float.Parse(words[4], CultureInfo.InvariantCulture)));
                        }
                        if (words[0] == "vn")
                        {
                            normalne.Push(new Wektor(float.Parse(words[1], CultureInfo.InvariantCulture), float.Parse(words[2], CultureInfo.InvariantCulture), float.Parse(words[3], CultureInfo.InvariantCulture)));
                        }
                        if (words[0] == "f")
                        {
                            //odczytywanie trójkątów
                            words[1] = words[1].Replace('/', ' ');
                            words[2] = words[2].Replace('/', ' ');
                            words[3] = words[3].Replace('/', ' ');
                            string[] f1 = words[1].Split(' ');
                            string[] f2 = words[2].Split(' ');
                            string[] f3 = words[3].Split(' ');
                            int wc1 = Int16.Parse(f1[0]);
                            int normalna = Int16.Parse(f1[2]);
                            int wc2 = Int16.Parse(f2[0]);
                            int wc3 = Int16.Parse(f3[0]);
                            //Console.WriteLine(wc1 + " " + wc2 + " " + wc3);
                            //Console.WriteLine(wierzcholki.ElementAt(wierzcholki.Count - wc1) + " " + wierzcholki.ElementAt(wierzcholki.Count - wc2) + " " + wierzcholki.ElementAt(wierzcholki.Count - wc3));
                            trojkaty.Push(new Trojkat(wierzcholki.ElementAt(wierzcholki.Count - wc1), wierzcholki.ElementAt(wierzcholki.Count - wc2), wierzcholki.ElementAt(wierzcholki.Count - wc3), normalne.ElementAt(normalne.Count - normalna)));
                        }

                    }
                }
                finally
                {
                    if (file != null)
                        file.Close();
                }
            }
            //scena
            Stack<Obiekt> obiekty = new Stack<Obiekt>();
            //obiekty.Push(new Sfera(0.0f, 0.0f, 0.5f, 0.5f));
            //obiekty.Push(new Sfera(-0.5f, -0.0f, -1.0f, 0.34f));
            //obiekty.Push(new Sfera(0.5f, -0.2f, -2.0f, 0.34f));
            //geometria z obj do stosu
            for (int obj = 0; obj < trojkaty.Count; obj++)
            {
               obiekty.Push(new Trojkat(trojkaty.ElementAt(obj).Vert1,trojkaty.ElementAt(obj).Vert2,trojkaty.ElementAt(obj).Vert3));
            }
            obiekty.Push(new Trojkat(-1.5f, -0.5f, -3.0f, -1.5f, -0.5f, 5.0f, 1.5f, -0.5f, 5.0f)); //podloga 1
            obiekty.Push(new Trojkat(-1.5f, -0.5f, -3.0f, 1.5f, -0.5f, 5.0f, 1.5f, -0.5f, -3.0f)); //podloga 2
            obiekty.Push(new Trojkat(-1.5f, -0.5f, -3.0f, 1.5f, -0.5f, -3.0f, -1.5f, 2.0f, -3.0f)); //tyl 1
            obiekty.Push(new Trojkat(-1.5f, 2.0f, -3.0f, 1.5f, -0.5f, -3.0f, 1.5f, 2.0f, -3.0f)); //tyl 2
            obiekty.Push(new Trojkat(-1.5f, -0.5f, 5.0f, -1.5f, -0.5f, -3.0f, -1.5f, 2.0f, -3.0f)); //lewa 1
            obiekty.Push(new Trojkat(-1.5f, -0.5f, 5.0f, -1.5f, 2.0f, -3.0f, -1.5f, 2.0f, 5.0f)); //lewa 2
            obiekty.Push(new Trojkat( 1.5f, 2.0f, -3.0f, 1.5f, -0.5f, -3.0f, 1.5f, -0.5f, 5.0f)); //prawa 1
            obiekty.Push(new Trojkat(1.5f, 2.0f, 5.0f, 1.5f, 2.0f, -3.0f, 1.5f, -0.5f, 5.0f)); //prawa 2
            obiekty.Push(new Trojkat(1.5f, 2.0f, 5.0f, -1.5f, 2.0f, 5.0f, -1.5f, 2.0f, -3.0f)); //sufit 1
            obiekty.Push(new Trojkat(1.5f, 2.0f, -3.0f, 1.5f, 2.0f, 5.0f, -1.5f, 2.0f, -3.0f)); //sufit 2
            

            for (int i = 0; i < obiekty.Count; i++)
            {
                obiekty.ElementAt(i).material = new Material(0.0f, 0.0f, 0.0f);
                obiekty.ElementAt(i).material.SpecularKoef = 200.0f;
                obiekty.ElementAt(i).material.Specular = new Kolor(1.0f, 1.0f, 1.0f);
                obiekty.ElementAt(i).material.Diffuse = new Kolor(1.0f, 1.0f, 0.0f);
                if((i>9)) obiekty.ElementAt(i).material.Szklo = 1.5f;
                obiekty.ElementAt(i).material.setBit("tex.bmp");
            }
            obiekty.ElementAt(0).material.Diffuse = new Kolor(1.0f, 1.0f, 1.0f);
            obiekty.ElementAt(1).material.Diffuse = new Kolor(1.0f, 1.0f, 1.0f);
            obiekty.ElementAt(2).material.Diffuse = new Kolor(0, 0.8f, 0);
            obiekty.ElementAt(3).material.Diffuse = new Kolor(0, 0.8f, 0);
            obiekty.ElementAt(4).material.Diffuse = new Kolor(0.8f, 0, 0);
            obiekty.ElementAt(5).material.Diffuse = new Kolor(0.8f, 0, 0);
            obiekty.ElementAt(6).material.Diffuse = new Kolor(1.0f, 1.0f, 1.0f);
            obiekty.ElementAt(7).material.Diffuse = new Kolor(1.0f, 1.0f, 1.0f);
            obiekty.ElementAt(8).material.Diffuse = new Kolor(1.0f, 1.0f, 1.0f);
            obiekty.ElementAt(9).material.Diffuse = new Kolor(1.0f, 1.0f, 1.0f);
            //obiekty.ElementAt(obiekty.Count - 2).material.Lustro = 1.0f;
            //obiekty.ElementAt(obiekty.Count - 1).material.Szklo = 1.5f;

            //swiatlo
            Stack<Swiatlo> swiatla = new Stack<Swiatlo>();
            //swiatla.Push(new SwiatloPunkt(0.6f, 0.6f, 0.6f, 0.08f, new Wektor(0, 0.75f, 3.1f)));
            swiatla.Push(new SwiatloPunkt(0.4f, 0.4f, 0.4f, 350f, new Wektor(0, 1.5f, 0.5f)));

            //Ortographic kamera = new Ortographic(new Wektor(0,0,5f), new Wektor(0,0,-1), obiekty, swiatla, new Obrazek(500,500));
            Perspective kamera = new Perspective(0,0,4,new Wektor(0.0f, 0.75f, 3), new Wektor(0, 0, -1), obiekty, swiatla, new Obrazek(400, 400));

            kamera.render_scene();
            //Console.Read();
            Console.Beep();
        }
    }
}
